/*
 *
 *  Copyright (C) 2012-2024
 *  All rights reserved, Designed By 杭州连线客信息技术有限公司
 *  注意：
 *  本软件为杭州连线客信息技术有限公司开发研制，未经购买不得使用
 *  购买后可获得全部源代码（禁止转卖、分享、上传到码云、github等开源平台）
 *  一经发现盗用、分享等行为，将追究法律责任，后果自负
 *
 */

package com.lxk.oms.flow.pay;

import cn.hutool.core.util.ObjectUtil;
import com.lxk.event.oms.enums.OrderEnums;
import com.lxk.oms.order.domain.vo.OmsOrderVo;
import com.lxk.service.finance.response.UserAccountDto;
import com.lxk.service.ums.response.UmsUserDto;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.domain.FlowBaseContext;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.lxk.event.oms.enums.OrderEnums.PayType.THIRD_PAY;

/**
 * 支付上下文
 *
 * @author heyi
 * 2024/8/22
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class PayContext extends FlowBaseContext {


    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 订单
     */
    private List<String> orderNo;
    /**
     * 支付类型
     *
     * @see OrderEnums.PayType
     */
    private String payType;

    /**
     * 用户
     */
    private UmsUserDto user;

    /**
     * 订单
     */
    private List<OmsOrderVo> omsOrder;


    /**
     * 用户余额
     */
    private UserAccountDto userAccount;

    /**
     * 订单是否支付 true 支付，false 未支付
     */
    private Boolean payStatus = false;

    /**
     * 强制支付 一般用线下支付的场景,开启后会往余额账户冲一笔订单支付作为余额支付使用， true=支付
     */
    private Boolean yuForcePay = false;

    /**
     * 支付金额过
     */
    private PayResult payResult;

    /**
     * 内部支付订单
     */
    private PayInnerOrder payInnerOrder;

    /**
     * 尚未支付
     *
     * @return
     */
    public Boolean isNotPay() {
        return !isPay();
    }

    /**
     * 已支付
     *
     * @return
     */
    public Boolean isPay() {
        return payStatus;
    }

    /**
     * 是否第三方支付
     *
     * @return
     */
    public Boolean isThirdPay() {
        return THIRD_PAY.contains(payType);
    }

    /**
     * 是否第三方支付
     *
     * @return
     */
    public Boolean isNotThirdPay() {
        return !isThirdPay();
    }


    /**
     * 是否需要库存
     *
     * @return
     */
    public Boolean needStock(OmsOrderVo omsOrder) {
        Integer needStock = omsOrder.getNeedStock();
        if (ObjectUtil.isNull(needStock)) {
            return true;
        }
        return OrderEnums.NeedStock.YES.getCode().equals(needStock);
    }


    /**
     * 支付订单
     */
    @Data
    public static class PayInnerOrder {
        /**
         * 租户
         */
        private String tenantId;

        /**
         * 合并订单编号
         */
        private String combineOutTradeNo;

        /**
         * 支付金额
         */
        private BigDecimal totalPrice;

        /**
         * 商户的订单号
         */
        private String outTradeNo;

        /**
         * 是否合并订单， 默认false 非合并订单
         */
        private Boolean combine = false;


    }


    @Data
    public static class PayResult {

        /**
         * 是否成功
         */
        private Boolean success = Boolean.TRUE;

        /**
         * 消息
         */
        private String msg;

        /**
         * 订单号
         */
        private String nonceStr;

        /**
         * 订单
         */
        private List<OmsOrderVo> omsOrder;
        /**
         * 第三方支付信息
         */
        private String thirdPayInfo;

        /**
         * 微信支付信息
         */
        private Map<String, String> packageParams = new HashMap<>();

        private Object appPayResponse;

//        /**
//         * 获取订单状态
//         *
//         * @return
//         */
//        public Integer getStatus() {
//            return omsOrder.getStatus();
//        }
    }

}
